﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Dao;
using Dao.Intermediarios;

namespace _InformaticaIndustrial_DerivdosVinicos.Interfaz
{
    public partial class PrediccionDemanda : Form
    {
        IPProducto ipProd = new IPProducto();
        IPDemanda ipDem = new IPDemanda();
        IPParametros ipParam = new IPParametros();
        IPCoeficiente ipCoef = new IPCoeficiente();
        IList<Coeficiente> coeficientes;
        IList<Demanda> listaDem;
        ParametrosDemanda param;
        Demanda demanda;
        int valor;
        bool esNueva;
        Demanda dem;
        Demanda nuevaDem = new Demanda();
        double suma = 0;
        double estimMovil;
        double demEstim;
        int period;
       
        string metodo;

        public PrediccionDemanda(Principal principal)
        {
            InitializeComponent();
            cargarCombos();
            btCalcular.Enabled = false;
        }

        public void cargarCombos()
        {
            cbProducto.DataSource = ipProd.getAll<Producto>();
        }

        private void btBuscar_Click(object sender, EventArgs e)
        {
           // int valor = Convert.ToInt16(comboBoxProducto.SelectedValue);
            valor = Convert.ToInt16(cbProducto.SelectedValue);
            listaDem = ipDem.getCriterioById<Demanda>("", "", valor);
             foreach(var l in listaDem){
                 if (l.demandaReal == 0)
                     listaDem.Remove(l);
                     esNueva = true;
             }
            param = ipParam.getAll<ParametrosDemanda>().Last<ParametrosDemanda>();
            coeficientes = ipCoef.getCriterioById<Coeficiente>("", "", Convert.ToInt16(param.idParametros));
            btCalcular.Enabled = true;
        }

        private void btCalcular_Click(object sender, EventArgs e)
        {
            
            listaDem.OrderBy(p => p.periodo).ToList();
            dem=listaDem.Last<Demanda>();
            period = Convert.ToInt16(dem.periodo + 1);
           
            int i = listaDem.Count;
            int k = i - Convert.ToInt16(param.nMovil);
          
            estimMovil = Convert.ToDouble(suma / param.nMovil);
            suma = 0;
            if (cbMetodo.SelectedItem.ToString() == "Promedio Movil")
            {            
                while (i > k)
                {
                    suma = suma + Convert.ToDouble(listaDem[i - 1].demandaReal);
                    --i;
                }

                demEstim = Convert.ToDouble(suma / param.nMovil);

                DataGridViewRow fila = new DataGridViewRow();

                DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();
                cell = new DataGridViewTextBoxCell();

                cell.Value =period;
                fila.Cells.Add(cell);

                cell = new DataGridViewTextBoxCell();

                cell.Value = demEstim;
                fila.Cells.Add(cell);

                dgEstimada.Rows.Add(fila);
                metodo = "PromedioMovil";

            }
            else if (cbMetodo.SelectedItem.ToString() == "Promedio Ponderado") 
            {
                suma = 0;
                while (i > k)
                {
                    suma = suma + Convert.ToDouble(listaDem[i - 1].demandaReal) * Convert.ToDouble(coeficientes[i - 1].valor);
                    --i;
                }

                DataGridViewRow fila = new DataGridViewRow();

                DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();
                cell = new DataGridViewTextBoxCell();

                cell.Value = period;
                fila.Cells.Add(cell);

                cell = new DataGridViewTextBoxCell();

                cell.Value = suma;
                fila.Cells.Add(cell);

                dgEstimada.Rows.Add(fila);
                metodo = "PromedioPonderado";
                demEstim = suma;
            }
            else if (cbMetodo.SelectedItem.ToString() == "Exponencial")
            {
 
                listaDem.OrderBy(p => p.periodo).ToList();
                dem=listaDem.Last<Demanda>();
           
                demEstim=Convert.ToDouble(dem.demandaEstimada + param.alfa * (dem.demandaReal - dem.demandaEstimada));

                DataGridViewRow fila = new DataGridViewRow();

                DataGridViewTextBoxCell cell = new DataGridViewTextBoxCell();
                cell = new DataGridViewTextBoxCell();

                cell.Value = period;
                fila.Cells.Add(cell);

                cell = new DataGridViewTextBoxCell();

                cell.Value = demEstim;
                fila.Cells.Add(cell);

                dgEstimada.Rows.Add(fila);


                metodo ="Exponencial";
            }
             nuevaDem = new Demanda();
             nuevaDem.demandaEstimada = demEstim;
             nuevaDem.periodo = dem.periodo + 1;
             nuevaDem.IdProducto = valor;
             nuevaDem.metodoPrediccion = metodo;
        }

        private void btSalir_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btGuardar_Click(object sender, EventArgs e)
        {
            if (esNueva == true)
            {
                nuevaDem.periodo = dem.periodo;
                Intermediario.confirmarCambios();
            }
            else
            {
              ipDem.save<Demanda>(nuevaDem);
            }
       MessageBox.Show("La demanda ha sido actualizada, con el valor de la Demanda predecida");

        }
    }
}

